package com.xiaoxie.report.mapper;

import com.xiaoxie.common.utils.StringUtils;
import com.xiaoxie.report.domain.QueryCondition;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Component;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class ReportDataSqlProvider {


    public String getQuerySql(@Param("sql") String sql,
                              @Param("params") Map<String, String> params,
                              @Param("queryConditions") List<QueryCondition> queryConditions) {
        // 判断sql是否为空
        if (sql == null || sql.trim().isEmpty()) {
            throw new RuntimeException("sql语句不能为空！");
        }
        String actSql = sql.replaceAll("\\\\r\\\\n", " ");
        // actSql去掉前后的空白字符
        actSql = actSql.trim();
        // 获取actSql的第一个单词
        String firstWord = actSql.split("\\s+")[0];
        // 判断第一个单词是否为select开头，只接收select语句
        if (!firstWord.equalsIgnoreCase("select")) {
            throw new RuntimeException("报表只接收select查询语句，请检查sql模板！");
        }
        // 判断必传参数是否包含在params中，如果没有则抛出异常
        for (QueryCondition condition : queryConditions) {
            if (condition.getRequired() == 1) {
                if (!params.containsKey(condition.getFiledName())) {
                    throw new RuntimeException("参数" + condition.getFiledName() + "为必传参数");
                }
            }
        }
        // 处理传入的参数，拼装查询sql
        actSql = "select * from (" + actSql + ") t where ";
        StringBuilder sb = new StringBuilder(actSql);
        for(Map.Entry<String,String> entry: params.entrySet()) {
            for (QueryCondition condition : queryConditions) {
                if (condition.getFiledName().equals(entry.getKey())) {
                    if(condition.getFiledType().equals("string")) {
                        switch (condition.getCompareType()) {
                            case "=", ">=", "<=", "<", ">", "<>", "!=" ->
                                    sb.append("t.").append(condition.getFiledName()).append(condition.getCompareType()).append(" '").append(entry.getValue()).append("' and ");
                            case "like" ->
                                    sb.append("t.").append(condition.getFiledName()).append(" like '%").append(entry.getValue()).append("%' and ");
                            case "in" -> {
                                // 把值按,号进行拆分，拆分出来的字符串要去空前后空格，并且前后加上''最终转为一个字符串
                                if (StringUtils.isEmpty(entry.getValue())) {
                                    sb.append("t.").append(condition.getFiledName()).append(" in ('') and ");
                                }
                                String[] values = entry.getValue().split(",");
                                if (values.length == 0) {
                                    sb.append("t.").append(condition.getFiledName()).append(" in ('') and ");
                                }
                                StringBuilder sb2 = new StringBuilder();
                                String inClause = Arrays.stream(values)
                                        .map(String::trim)
                                        .map(s -> "'" + s + "'")
                                        .collect(Collectors.joining(","));
                                sb.append("t.").append(condition.getFiledName()).append(" in (").append(inClause).append(") and ");
                            }
                        }
                    }
                    if(condition.getFiledType().equals("number")) {
                        switch (condition.getCompareType()) {
                            case "=", ">=", "<=", "<", ">", "<>", "!=" ->
                                    sb.append("t.").append(condition.getFiledName()).append(condition.getCompareType()).append(" ").append(entry.getValue()).append(" and ");
                            case "in" -> {
                                // 把值按,号进行拆分，拆分出来的字符串要去空前后空格，并且前后加上''最终转为一个字符串
                                if(!StringUtils.isEmpty(entry.getValue()) && entry.getValue().split(",").length > 0) {
                                    sb.append("t.").append(condition.getFiledName()).append(" in (").append(entry.getValue()).append(") and ");
                                }
                            }
                         }
                    }
                    if (condition.getFiledType().equals("date")) {
                        switch (condition.getCompareType()) {
                            case "=", ">=", "<=", "<", ">", "<>", "!=" ->
                                    sb.append("t.").append(condition.getFiledName()).append(condition.getCompareType()).append(" '").append(entry.getValue().trim()).append("' and ");
                            case "in" -> {
                                String[] values = entry.getValue().split(",");
                                // 把值按,号进行拆分，拆分出来的字符串要去空前后空格，并且前后加上''最终转为一个字符串
                                if (!StringUtils.isEmpty(entry.getValue()) && values.length > 0) {
                                    StringBuilder sb2 = new StringBuilder();
                                    String inClause = Arrays.stream(values)
                                            .map(String::trim)
                                            .map(s -> "'" + s + "'")
                                            .collect(Collectors.joining(","));
                                    sb.append("t.").append(condition.getFiledName()).append(" in (").append(inClause).append(") and ");
                                }
                            }
                        }

                    }
                }
            }
        }

        if(!sb.isEmpty()) {
            actSql = sb.substring(0, sb.length() - 5);
        }
        return actSql;
    }
}
